Turva oma Django REST Framework API-d tugeva autentimisega. Võrdle Token autentimist ja JWT (JSON Web Token) rakendamist, sealhulgas praktilisi koodinäiteid ja parimaid tavasid.
Python DRF autentimine: Token vs. JWT rakendamine tugevate API-de jaoks
API-de turvamine on ülimalt tähtis. Pythoni ja Django REST Framework (DRF) abil API-sid luues on teil saadaval mitu autentimisvalikut. See artikkel süveneb kahte populaarsesse meetodisse: Token autentimine ja JWT (JSON Web Token) autentimine, võrreldes nende tugevusi ja nõrkusi ning pakkudes praktilisi rakendusnäiteid.
Autentimise mõistmine API-des
Autentimine on protsess, mille käigus kontrollitakse teie API-le juurde pääseva kasutaja või rakenduse identiteeti. Hästi rakendatud autentimissüsteem tagab, et kaitstud ressurssidele pääsevad juurde ainult volitatud üksused. RESTful API-de kontekstis hõlmab autentimine tavaliselt mandaatide (nt kasutajanimi ja parool) saatmist iga päringuga. Seejärel kontrollib server neid mandaate ja kui need on kehtivad, annab juurdepääsu.
Token autentimine
Token autentimine on lihtne ja arusaadav mehhanism. Kui kasutaja logib edukalt sisse, genereerib server unikaalse juhusliku tokeni ja salvestab selle andmebaasi, sidudes selle kasutajaga. Seejärel saadab klient selle tokeni järgnevate päringute 'Authorization' päises. Server hangib tokeni andmebaasist, kontrollib selle kehtivust ja annab vastavalt juurdepääsu.
Rakendamine DRF-iga
DRF pakub sisseehitatud tuge Token autentimiseks. Siin on, kuidas seda rakendada:
- Installige DRF ja registreerige see oma Django projektis:
Esmalt veenduge, et teil on Django REST Framework installitud:
pip install djangorestframework
Seejärel lisage see oma `INSTALLED_APPS`-i failis `settings.py`:
INSTALLED_APPS = [
...
'rest_framework',
]
- Lisage TokenAuthentication skeem vaikimisi autentimisklassina (valikuline, kuid soovitatav):
Lisage oma faili `settings.py` järgmine:
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.TokenAuthentication',
'rest_framework.authentication.SessionAuthentication',
],
}
See rakendab Token Authenticationi globaalselt kogu teie API-s. `SessionAuthentication` on kaasatud brauseripõhiseks suhtluseks, kuid saate selle eemaldada puhtalt API-põhise rakenduse jaoks.
- Looge iga kasutaja jaoks Token:
Saate kasutajate jaoks automaatselt tokeneid luua loomisel, lisades signaalikäitleja. Looge oma rakenduses fail nimega `signals.py` (nt `users/signals.py`):
from django.conf import settings
from django.db.models.signals import post_save
from django.dispatch import receiver
from rest_framework.authtoken.models import Token
@receiver(post_save, sender=settings.AUTH_USER_MODEL)
def create_auth_token(sender, instance=None, created=False, **kwargs):
if created:
Token.objects.create(user=instance)
Seejärel importige see fail `signals.py` oma faili `users/apps.py` rakenduse konfiguratsiooniklassi meetodis `ready`. Näide faili `users/apps.py` jaoks:
from django.apps import AppConfig
class UsersConfig(AppConfig):
default_auto_field = 'django.db.BigAutoField'
name = 'users'
def ready(self):
import users.signals
Nüüd saate tokeneid hallata käsurea abil:
python manage.py drf_create_token <username>
- Rakendage oma API vaated:
Siin on lihtne näide vaatest, mis nõuab Token autentimist:
from rest_framework import permissions
from rest_framework.response import Response
from rest_framework.views import APIView
class ExampleView(APIView):
authentication_classes = [TokenAuthentication]
permission_classes = [permissions.IsAuthenticated]
def get(self, request):
content = {
'message': 'Tere, ' + request.user.username + '! Sa oled autentitud.',
}
return Response(content)
Selles näites määrab `authentication_classes`, et tuleks kasutada Token autentimist, ja `permission_classes` määrab, et vaatele pääsevad juurde ainult autentitud kasutajad.
- Lisage sisselogimise API vaade:
Vajate ka lõpp-punkti tokeni loomiseks pärast edukat sisselogimist:
from django.contrib.auth import authenticate
from rest_framework import status
from rest_framework.authtoken.models import Token
from rest_framework.decorators import api_view, permission_classes
from rest_framework.permissions import AllowAny
from rest_framework.response import Response
@api_view(['POST'])
@permission_classes([AllowAny])
def login(request):
username = request.data.get('username')
password = request.data.get('password')
user = authenticate(username=username, password=password)
if user:
token, _ = Token.objects.get_or_create(user=user)
return Response({'token': token.key})
else:
return Response({'error': 'Valed mandaadid'}, status=status.HTTP_401_UNAUTHORIZED)
Token autentimise eelised
- Lihtsus: Lihtne rakendada ja mõista.
- Olekutu: Iga tokeni päring sisaldab teavet, mis võimaldab sellel eraldiseisvalt toimida.
Token autentimise puudused
- Andmebaasi sõltuvus: Nõuab tokeni valideerimiseks iga päringu jaoks andmebaasi otsingut. See võib mõjutada jõudlust, eriti suuremahuliste süsteemide puhul.
- Tokeni tühistamine: Tokeni tühistamine nõuab selle andmebaasist kustutamist, mis võib olla keeruline.
- Skaleeritavus: Ei pruugi olla kõige skaleeritavam lahendus suurte suure liiklusega API-de jaoks andmebaasi koormuse tõttu.
JWT (JSON Web Token) autentimine
JWT autentimine on kaasaegsem ja keerukam lähenemisviis. JWT on kompaktne URL-turvaline JSON-objekt, mis sisaldab väiteid kasutaja kohta. Need väited on digitaalselt allkirjastatud salajase võtme või avaliku/privaatse võtmepaari abil. Kui kasutaja logib sisse, genereerib server JWT ja saadab selle kliendile. Seejärel lisab klient selle JWT järgnevate päringute 'Authorization' päisesse. Server saab JWT allkirja kontrollida ilma andmebaasile juurde pääsemata, muutes selle tõhusamaks ja skaleeritavamaks lahenduseks.
Rakendamine DRF-iga
DRF ei paku sisseehitatud tuge JWT autentimiseks, kuid mitmed suurepärased teegid muudavad selle integreerimise lihtsaks. Üks populaarsemaid on `djangorestframework-simplejwt`.
- Installige `djangorestframework-simplejwt`:
pip install djangorestframework-simplejwt
- Konfigureerige DRF seaded:
Lisage oma faili `settings.py` järgmine:
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_simplejwt.authentication.JWTAuthentication',
'rest_framework.authentication.SessionAuthentication',
),
}
SIMPLE_JWT = {
'ACCESS_TOKEN_LIFETIME': timedelta(minutes=5),
'REFRESH_TOKEN_LIFETIME': timedelta(days=1),
'ROTATE_REFRESH_TOKENS': False,
'BLACKLIST_AFTER_ROTATION': True,
'ALGORITHM': 'HS256',
'SIGNING_KEY': settings.SECRET_KEY,
'VERIFYING_KEY': None,
'AUTH_HEADER_TYPES': ('Bearer',),
'USER_ID_FIELD': 'id',
'USER_ID_CLAIM': 'user_id',
'AUTH_TOKEN_CLASSES': ('rest_framework_simplejwt.tokens.AccessToken',),
'TOKEN_TYPE_CLAIM': 'token_type',
}
Seadete selgitus:
- `ACCESS_TOKEN_LIFETIME`: Kui kaua on juurdepääsu token kehtiv (näiteks 5 minutit).
- `REFRESH_TOKEN_LIFETIME`: Kui kaua on värskendustoken kehtiv (näiteks 1 päev). Värskendustokeneid kasutatakse uute juurdepääsutokenite hankimiseks ilma, et kasutaja peaks uuesti sisse logima.
- `ROTATE_REFRESH_TOKENS`: Kas värskendustokeneid tuleks pärast iga kasutamist pöörata.
- `BLACKLIST_AFTER_ROTATION`: Kas vanad värskendustokenid tuleks pärast pööramist musta nimekirja kanda.
- `ALGORITHM`: Algoritm, mida kasutatakse JWT allkirjastamiseks (HS256 on tavaline valik).
- `SIGNING_KEY`: Salajane võti, mida kasutatakse JWT allkirjastamiseks (tavaliselt teie Django SECRET_KEY).
- `AUTH_HEADER_TYPES`: Autentimispäise tüüp (tavaliselt "Bearer").
- Lisage sisselogimise ja värskendustokeni API vaated:
`djangorestframework-simplejwt` pakub vaateid tokenite hankimiseks ja värskendamiseks. Lisage need oma faili `urls.py`:
from django.urls import path
from rest_framework_simplejwt.views import (
TokenObtainPairView,
TokenRefreshView,
)
urlpatterns = [
path('token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
path('token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
]
`TokenObtainPairView` pakub pärast edukat autentimist juurdepääsu- ja värskendustokeneid. `TokenRefreshView` pakub uue juurdepääsutokeni, kui esitatakse kehtiv värskendustoken.
- Rakendage oma API vaated:
Siin on lihtne näide vaatest, mis nõuab JWT autentimist:
from rest_framework import permissions
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework_simplejwt.authentication import JWTAuthentication
class ExampleView(APIView):
authentication_classes = [JWTAuthentication]
permission_classes = [permissions.IsAuthenticated]
def get(self, request):
content = {
'message': 'Tere, ' + request.user.username + '! Sa oled autentitud.',
}
return Response(content)
Sarnaselt Token autentimise näitele määrab `authentication_classes`, et tuleks kasutada JWT autentimist, ja `permission_classes` piirab juurdepääsu ainult autentitud kasutajatele.
JWT autentimise eelised
- Skaleeritavus: Tokeni valideerimiseks pole vaja andmebaasi otsingut, mis muudab selle skaleeritavamaks.
- Olekutu: JWT sisaldab kogu autentimiseks vajalikku teavet.
- Standardiseeritud: JWT on laialdaselt kasutatav standard, mida toetavad paljud teegid ja platvormid.
- Mikroteenuste sõbralik: Sobib mikroteenuste arhitektuuridele, kuna teenused saavad JWT-sid iseseisvalt kontrollida.
JWT autentimise puudused
- Keerukus: Keerulisem rakendada kui Token autentimine.
- Tokeni suurus: JWT-d võivad olla suuremad kui lihtsad tokenid, mis võib suurendada ribalaiuse kasutust.
- Tokeni tühistamine: JWT tühistamine on keeruline. Pärast väljastamist on see kehtiv kuni aegumiseni. Lahendused hõlmavad tühistatud tokenite musta nimekirja kandmist, mis taastab andmebaasi sõltuvuse.
Tokeni tĂĽhistamise strateegiad
Nii Token kui ka JWT autentimismeetodid nõuavad juurdepääsu tühistamise mehhanisme. Siin on, kuidas saate tokeni tühistamisele läheneda:
Token autentimise tĂĽhistamine
Token autentimise korral on tĂĽhistamine lihtne: lihtsalt kustutage token andmebaasist:
from rest_framework.authtoken.models import Token
try:
token = Token.objects.get(user=request.user)
token.delete()
except Token.DoesNotExist:
pass
JWT autentimise tĂĽhistamine
JWT tühistamine on keerulisem, kuna token ise on iseseisev ja ei sõltu valideerimisel andmebaasi otsingust (algselt). Levinud strateegiad hõlmavad järgmist:
- Tokeni musta nimekirja kandmine: Salvestage tühistatud tokenid musta nimekirja (nt andmebaasi tabelisse või Redis vahemällu). Enne JWT valideerimist kontrollige, kas see on mustas nimekirjas. `djangorestframework-simplejwt` pakub sisseehitatud tuge värskendustokenite musta nimekirja kandmiseks.
- Lühikesed aegumisajad: Kasutage lühikesi juurdepääsutokenite aegumisajaid ja lootke värskendustokenitele, et sageli uusi juurdepääsutokeneid hankida. See piirab kahjustatud tokeni kasutamise võimalust.
- Pöörake värskendustokeneid: Pöörake värskendustokeneid pärast iga kasutamist. See muudab vanad tokenid iga kord kehtetuks ja takistab tokenite vargust.
OAuth2 ja OpenID Connect
Keerukamate autentimis- ja autoriseerimisstsenaariumide korral kaaluge OAuth2 ja OpenID Connect kasutamist. Need standardid pakuvad tugeva raamistiku ressurssidele juurdepääsu delegeerimiseks ilma mandaate jagamata. OAuth2 on peamiselt autoriseerimisprotokoll, samas kui OpenID Connect ehitab OAuth2-le, et pakkuda autentimisteenuseid. Mitmed Django paketid, nagu `django-oauth-toolkit` ja `django-allauth`, hõlbustavad OAuth2 ja OpenID Connect integreerimist teie DRF API-desse.
Näidisstsenaarium: Kasutaja soovib anda kolmanda osapoole rakendusele juurdepääsu oma API-s salvestatud andmetele. OAuth2 abil saab kasutaja rakendust autoriseerida ilma oma kasutajanime ja parooli jagamata. Selle asemel saab rakendus juurdepääsutokeni, mida saab kasutada kasutaja andmetele juurdepääsuks määratletud õiguste ulatuses.
Õige autentimismeetodi valimine
Parim autentimismeetod sõltub teie konkreetsetest nõuetest:
- Lihtsus ja rakendamise kiirus: Token autentimist on ĂĽldiselt lihtsam algselt rakendada.
- Skaleeritavus: JWT autentimine on suure liiklusega API-de jaoks skaleeritavam.
- Turvanõuded: Arvestage oma andmete tundlikkust ja vajalikku turvataset. OAuth2/OpenID Connect pakuvad kõige tugevamaid turvafunktsioone, kuid nõuavad keerukamat rakendamist.
- Mikroteenuste arhitektuur: JWT-d sobivad hästi mikroteenustele, kuna iga teenus saab tokeneid iseseisvalt kontrollida.
Parimad tavad API autentimiseks
- Kasutage HTTPS-i: Kasutage alati HTTPS-i, et krĂĽpteerida side kliendi ja serveri vahel, kaitstes mandaate pealtkuulamise eest.
- Salvestage saladusi turvaliselt: Ärge kunagi salvestage salajasi võtmeid või paroole lihttekstina. Kasutage keskkonnamuutujaid või turvalisi konfiguratsioonihalduse tööriistu.
- Rakendage kiiruse piirang: Kaitske oma API-t kuritarvitamise eest, rakendades kiiruse piirangu, et piirata päringute arvu, mida klient saab teatud aja jooksul teha.
- Valideerige sisend: Valideerige põhjalikult kõik sisendandmed, et vältida süstimisrünnakuid.
- Jälgige ja logige: Jälgige oma API-t kahtlase tegevuse suhtes ja logige autentimissündmused auditeerimise eesmärgil.
- Regulaarselt värskendage teeke: Hoidke oma Django, DRF ja autentimisteegid ajakohasena, et saada kasu turvapaikadest ja täiustustest.
- Rakendage CORS (Cross-Origin Resource Sharing): Konfigureerige CORS õigesti, et lubada ainult usaldusväärsetel domeenidel juurdepääs teie API-le veebibrauseritest.
Järeldus
Sobiva autentimismeetodi valimine on teie DRF API-de turvamiseks ülioluline. Token autentimine pakub lihtsust, samas kui JWT autentimine pakub skaleeritavust ja paindlikkust. Iga meetodi eeliste ja puuduste mõistmine koos API turvalisuse parimate tavadega võimaldab teil luua tugevaid ja turvalisi API-sid, mis kaitsevad teie andmeid ja kasutajaid.
Ärge unustage arvestada oma konkreetsete vajadustega ja valida lahendus, mis tasakaalustab kõige paremini turvalisuse, jõudluse ja rakendamise lihtsuse. Keerukamate autoriseerimisstsenaariumide korral uurige OAuth2 ja OpenID Connect.